home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
kowin
/
archive
/
sys
/
kowin14d.lzh
/
doc
/
programming
/
memory.doc
< prev
next >
Wrap
Text File
|
1995-11-14
|
5KB
|
114 lines
Ko-Window プログラマーズマニュアル
「メモリ関連」 (難易度:高)
● Ko-Window でのメモリ確保
Ko-Window で任意の領域のメモリを必要とした場合、動的に確保して使用できるの
は以下の関数です。
・malloc()/free() ----- ノーマル版(XC-lib や libc 標準の malloc)
普通にコンパイルした場合、XClib や libc での malloc() (calloc等も当然含む)
はそれぞれのプロセスに最初に割り当てられた固定サイズの HEAP領域からメモリの
確保を行います。ウィンドウプログラム終了時に HEAP は勝手に開放されるため、もっ
とも簡単でかつ高速です。細かな領域を頻繁に確保したり開放したりする必要がある
場合は、最初に任意の大きさの HEAP を確保したのちこの malloc() を使用して下さ
い。
・malloc()/free() ----- mm_alloc ライブラリ版 (v2.24+14 以降付属)
実行時にあわせて消費するメモリ量が違ってくる場合、例えばテキストエディタ等
は読み込むファイルの大きさによって必要とするメモリが極端に異なってしまいます。
そういう場合は mm_alloc ライブラリ( mm_klib.a ) を使用して下さい。これを最初
にリンクしておくだけで、ヒープ領域は自動拡張されるようになります。
<<WindowHeapSize の設定値の参照はいつか>>
HEAP 領域は最初の起動時に、グローバル変数 WindowHeapSize に初期値として書
き込んであるサイズ分だけ確保します。この変数の参照は起動時の1番最初だけ
なので、あとからプログラムで書き換えても意味がありません。つまりコンパイ
ル時の値のみ有効となります。
・MALLOC()/MFREE()
これは直接 OS の管理するメモリブロックを確保するものです。DOS CALL です。
Ko-Window の管理から外れ、OS から確保を行うため使うにはかなりの注意が必要で
す。もしどうしても使うのであれば、自分で確保した領域は必ず自分で責任を持って
開放して下さい。MFREE() せずにプログラムを終了すると、そのメモリブロックは存
在したまま残ります。(Ko-Windowを終了すれば一応開放される) このメモリの確保や
開放は極めて重く、細かい多数のメモリ確保には向きません。その代わり OS のメモ
リの残り容量を最大まで使用可能であるため、起動時にはどれだけ消費するか不明な
巨大な単一のブロックを確保する場合に向いています。かなりプログラミングに慣れ
たプログラマにしかお勧めできません。
・WindowMemoryAlloc()/WindowMemoryFree()
サーバーの HEAP 領域からメモリを確保します。サーバーの HEAP から確保する以
外はさほど取り立てて特徴はありません。MALLOC() 同様プログラムが終了しても残っ
てしまうため、使い終わったメモリは自分で責任を持って開放して下さい。MALLOC()
よりは細かなメモリ操作にも耐えます。
● Ko-Window 起動時のメモリ確保の仕組み
最初に1つのプロセスとして起動されたアプリケーションは、自分で持っていたHEAP
や STACK を捨てて常駐します。その時アプリケーション用の HEAP 領域を別の OS の
メモリブロックとして確保します。つまり通常の Human のプロセスとは違って、Ko
のアプリケーションは、HEAP 領域を使う場合は OS のメモリブロックを 2 つ確保す
ることになります。
Human では、実行プログラムには必ずその時存在する最大のメモリブロックが割り
当てられます。しかし MALLOC() による確保では、指定の容量が確保できる最初に見
つかった空き領域から確保されます。
1番最初のアプリケーションを起動する場合
(1) 起動前
──────┬───────────────────────────────
使用中 |空き(最大の空きブロック)
──────┴───────────────────────────────
(2) アプリケーションのプロセスをロード
最初はプログラムが最大の空きブロックを全部確保
──────┬───────────────────────────────
使用中 |Aプログラム
──────┴───────────────────────────────
(3) プログラム実行
プログラムが、自分で使う分だけを残して残りを開放
──────┬───────────┬───────────────────
使用中 |Aプログラム |空き(最大の空きブロック)
──────┴───────────┴───────────────────
(4) HEAP の確保
Koのアプリは、HEAP領域を別に確保する
──────┬───────────┬────┬──────────────
使用中 |Aプログラム |AのHEAP |空き(最大の空きブロック)
──────┴───────────┴────┴──────────────
(5) アプリケーションの常駐終了
アプリケーションを登録して終了、この時常駐に不要な部分はさらに切り落とす
──────┬──────┬────┬────┬──────────────
使用中 |Aプログラム |空き |AのHEAP |空き(最大の空きブロック)
──────┴──────┴────┴────┴──────────────
map.win 等でメモリブロックを見ていると、Ko-Window 起動時に最初に必ず不連続
部分ができるのはなぜか、と質問されることがあります。その理由は上記の通りです。
この後さらに Ko のアプリを起動した場合は、最大の空きブロックにプログラムは
ロードされるものの、HEAPは途中にある Aプログラム直後の空きに確保されることが
あります。map.win を見ていると一見不可解な動きをしているように見えますが、実
はこういうわけなのです。
1995/2/17 小笠原博之
oga@dgw.yz.yamagata-u.ac.jp
DenDenNET: DEN0006 COR.
1995/11/14 最終更新